package ar.uba.fi.algo3.algoflight.model.aviones;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import ar.uba.fi.algo3.algoflight.model.Posicion;
import ar.uba.fi.algo3.algoflight.model.juego.Escenario;
import ar.uba.fi.algo3.algoflight.model.juego.NivelDeDificultad;
import ar.uba.fi.algo3.algoflight.model.utils.Constantes;

public class CreadorDeAviones {

	private List<Class<? extends Avion>> listaDeAviones;

	public CreadorDeAviones() {
		listaDeAviones = new ArrayList<Class<? extends Avion>>();
		this.rellenarListaAviones();
	}

	private void rellenarListaAviones() {
		listaDeAviones.add(AvionComputarizado.class);
		listaDeAviones.add(AvionPesado.class);
		listaDeAviones.add(AvionSimple.class);
		listaDeAviones.add(Helicoptero.class);
	}

	public Avion crearAvion(NivelDeDificultad nivelDeDificultad,
			Escenario escenario) {
		Avion avionCreado = null;
		int index = new Random().nextInt(listaDeAviones.size());
		Constructor<?>[] constructores = listaDeAviones.get(index)
				.getConstructors();

		Posicion posicionBorde = escenario.getTamanioPerimetro()
				.getBordeAleatorio();
		float posX = posicionBorde.getCoordX();
		float posY = posicionBorde.getCoordY();
		float posFinalX = posX > 0 ? posX <= Constantes.ANCHO_ESCENARIO
				- Constantes.MAX_TAMANIO_AVIONES ? posX
				: Constantes.ANCHO_ESCENARIO - Constantes.MAX_TAMANIO_AVIONES
				: 0;
		float posFinalY = posY > Constantes.MAX_TAMANIO_AVIONES ? posY <= Constantes.ALTO_ESCENARIO ? posY
				: Constantes.ALTO_ESCENARIO
				: Constantes.MAX_TAMANIO_AVIONES;
		Posicion posicionInicial = new Posicion(posFinalX, posFinalY);

		try {
			avionCreado = (Avion) constructores[0].newInstance(posicionInicial,
					escenario);
			avionCreado.setVelocidadParaDificultad(nivelDeDificultad);
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}

		return avionCreado;
	}
}
